//引入其他的类
import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";


//游戏控制器，控制其他的所有类
class GameControl {
    //定义三个属性
    //蛇
    snake: Snake;
    //食物
    food: Food;
    //记分牌
    scorePanel: ScorePanel;
    //创建一个属性来存储蛇的移动方向（也就是按键的方向）
    direction: string = '';
    //创建一个属性用来记录游戏是否结束
    isLive = true;
    constructor() {
        this.snake = new Snake();
        this.food = new Food();
        //设置游戏的难度，接受两个参数一个是等级，一个是多少分升一级
        this.scorePanel = new ScorePanel();
        this.init()
    }


    //游戏的初始化方法，调用后游戏即开始
    init() {
        //绑定键盘按下的事件
        document.addEventListener('keydown', this.keydownHandler.bind(this));
        this.run()
    }
    /*
        ArrowUp Up
        ArrowDown Down
        ArrowLeft Left
        ArrowRight Right
        创建一个键盘按下的响应函数
    */
    keydownHandler(event: KeyboardEvent) {
        // console.log(event.key);
        this.direction = event.key;
    }

    //创建一个控制蛇移动的方法
    run() {
        /*
            根据方向（this.direction）来使蛇的位置改变
            向上 top 减少
            向下 top 增加
            向左 left 减少
            向右 left 增加
        */
        let X = this.snake.X
        let Y = this.snake.Y

        switch (this.direction) {
            case 'ArrowUp':
            case 'Up':
                //向上移动top减少
                Y -= 10;
                break;
            case 'ArrowDown':
            case 'Down':
                //向下移动top增加
                Y += 10;
                break;
            case 'ArrowLeft':
            case 'Left':
                // 向左移动 left 减少
                X -= 10
                break;
            case 'ArrowRight':
            case 'Right':
                // 向右移动 left 增加
                X += 10
                break;
        }

        //蛇吃到食物后的逻辑
        this.checkEat(X, Y)

        //修改蛇的X和Y的值
        try {
            this.snake.X = X;
            this.snake.Y = Y
        } catch (e: unknown) {//暂时不会解决错误类型的定义
            //进入到catch，说明出现了异常，弹出一个提示信息,断言e一定是个错误
            alert((e as Error).message + 'GAME OVER!');
            //将isLive设置为false，停止定时器
            this.isLive = false
        }

        //开启一个定时调用
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30);

    }

    //定义一个方法，用来检查蛇是否迟到食物
    checkEat(X: number, Y: number) {
        //坐标一致表示吃到食物了
        if (X === this.food.X && Y === this.food.Y) {
            console.log('吃到食物了！');
            //吃到食物了，改变一下食物的位置
            this.food.change();
            //分数增加
            this.scorePanel.addScore()
            //蛇要增加一节
            this.snake.addBody()
        }
    }

}

export default GameControl